제목을 보면 이게 무슨 소리인가 싶을 수 있다. 나도 처음 듣고 띠요옹? 했었다.

내가 알고 있는 MongoDB는 BASE(BA: Basically Avaliable) 즉, 가용성과 성능을 중시한 분산 시스템의 특성을 가지고 있고 또한 이 점이 기존에 ACID 특성을 가진 RDBMS와의 차이점이라고 알고 있었다.

더군다나 Mongo DB가 탄생하게 된 배경이 아래와 같은 고민 끝에 탄생한 것을 알았기에 더욱 의아했었다.

대규모 데이터를 처리해야 하는데 RDBMS는 성장 한계가 있구나 일관성과 무결성을 버리고
더 빠른 읽기 성능과 수평확장이 가능한 DB가 필요해!

그럼 어쩌다 제목과 같이 눈이 크게 떠지는 질문을 스스로에서 던졌을까

이번에 대규모 시스템 설계 기초 도서를 공부하면서 CAP이론이라는 것을 처음 접하며 이 의문이 시작되었다.

CAP이론 이란?

CAP 이론은 2000년에 에릭 브류어가 최초로 소개한 이론이며 어떤 분산 시스템이더라도 Consistency (일관성), Availability (가용성), Partition tolerance (분할 내성)를 모두 만족할 수 없다는 이론이다. 이 세 가지의 머리글자를 따서 CAP 이론이라고 부른다.

  • consistency: 분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속했느냐에 관계없이 언제나 같은 데이터를 보관해야 한다.
  • availability: 분산 시스템에 접속하는 클라이언트는 일부 노드에서 장애가 발생하더라도 항상 응답을 받을 수 있어야 한다.
  • partition tolerance: 파티션은 두 노드 사이에 통신 장애가 발생하였음을 의미한다. 파티션 감내는 네트워크에 파티션이 생기더라도 시스템은 계속해서 동작하여야 한다는 것을 의미한다.

CAP이론

즉 모두 만족할 수 없기에 CA, CP, AP로 구분되는데 P 즉 파티션 감내를 보장하기 위해서는 네트워크 장애가 절대 발생하면 안 된다는 가정이 필요하다. 그러나 통상 네트워크 장애는 피할 수 없다. 때문에 분산 시스템은 반드시 파티션 문제를 감내할 수 있도록 설계해야 하므로 실세계에서 CA시스템은 존재하지 않는다.

즉, 저장소는 아래 요구사항 가운데 어느 것을 만족하냐에 따라 분류할 수 있다.

  • CP 시스템: 일관성, 파티션 감내를 지원, 가용성을 조금 포기한다.
  • AP 시스템: 가용성과 파티션 감내를 지원, 일관성을 조금 포기한다.

그렇다면 가용성과 일관성 사이에서 Trade off를 해야 하기에 우리는 선택을 해야 한다.

그렇게 문득 어떤 DB들은 어떤 요구사항을 따를까 궁금해져서 서칭을 시작했다.

Mongo DB는 CP를 따른다.

이 부분이 본격적으로 내가 의문을 갖게 된 시점이다. “mongoDB는 의심의 여지없이 AP일 것이라고 생각했거늘” 소리가 육성으로 나왔다. 물론 CP, AP 둘 중 하나에 쏠린 시스템은 좋지 않다. 그렇기에 대부분의 분산 시스템은 상황에 따라 일관성과 가용성의 우선순위를 다르게 설정한다. 그렇더라도 mongoDB의 특성이나 다양한 배경을 봤을 때 기본적으로 AP일 것이라고 생각했다. 

PACELC 이론

역시 세상에는 똑똑하신 분이 많다. CAP이론에는 내가 가진 의문과 같은 한계가 있기에 그 한계를 보완하고자 나온 PACELC이라는 이론이 있다고 한다.

PACELC이론은 현실에서는 Partition 상황과 아닌(ELSE) 상황이 함께 존재한다고 가정하고, 2가지 상황을 나눠 각각 어떤 gaurantee를 선택할지 나누어 놓은 것이다.

처음 소개했던 두 가지 상황에  Partition 상황인지 아닌지를 나누어 한번 더 요구사항을 분할한다.

즉 구분을 다음과 같이 4가지로 나눌 수 있다.

  • PA/EL 시스템: partition 상황에서는 가용성이 중요하고 일반적인 상황에서는 속도가 우선인 시스템
  • PA/EC 시스템: partition 상황에서는 가용성이 중요하고 일반적인 상황에서는 일관성이 우선인 시스템
  • PC/EL 시스템: partition이든 그 외든 일관성이 가장 중요한 시스템
  • PC/EC 시스템: partition 상황에서는 일관성을 중요하게 생각하고 그 외는 속도가 우선인 시스템

MongoDB는 PA/EC를 따른다.

즉, 나는 분산환경에서 당연히 partition이 나누어져 있는 상황에서 MongoDB를 사용한다고 생각하여 일관성을 우선시한다는 말에 공감을 하지 못했던 것이다. 하지만 언제까지나 일반적인 상황에서는 일관성을 우선시하는 시스템이고 분산 환경에서는 가용성을 우선시한다.

그렇다면 분산 상황에서는 일관성을 보장하지 않는가 하면 또 그런 것도 아니다. Mongo DB는 Replica Set을 이용하여 클러스터를 구축한다. 이때, replication의 데이터 싱크가 비동기적으로 이루어지기 때문에 secondary에 복제되지 않은 데이터가 손실될 수 있다. 하지만 MongoDB는 MVCC(다중 버전 동시성 제어)라는 기법을 제공해 일관성도 수준급으로 보장한다. 

마무리

이렇듯 MongoDB는 CP다 일반적으로는 일관성을 중시하기 때문이다. 하지만 분산 환경에서는 AP다. partition 분할 시 가용성을 우선시하기 때문이다. 이렇게 좀 더 내용적으로 공부를 하고 나서야 의문이 풀렸다. 혹시라도 대규모 시스템 설계 기초 도서를 읽으며 나와 같은 의문을 가진 분께 조금이라도 도움이 되었으면 하는 마음이다.:)